/** * * Copyright 2014 The Darks ORM Project (Liu lihua) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package darks.orm.spring; import java.io.IOException; import java.util.Arrays; import java.util.Set; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.ClassPathBeanDefinitionScanner; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; import darks.orm.log.Logger; import darks.orm.log.LoggerFactory; public class MapperClassDefinitionScanner extends ClassPathBeanDefinitionScanner { private static Logger log = LoggerFactory.getLogger(MapperClassDefinitionScanner.class); private BeanDefinitionRegistry registry; public MapperClassDefinitionScanner(BeanDefinitionRegistry registry) { super(registry, false); this.registry = registry; } public void registerFilters() { addIncludeFilter(new TypeFilter() { public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { boolean ret = metadataReader.getClassMetadata().isAbstract() || metadataReader.getClassMetadata().isInterface(); return ret; } }); addExcludeFilter(new TypeFilter() { public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info"); } }); } @Override public int scan(String... basePackages) { int beanCountAtScanStart = this.registry.getBeanDefinitionCount(); doScan(basePackages); AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); return this.registry.getBeanDefinitionCount() - beanCountAtScanStart; } @Override protected Set<BeanDefinitionHolder> doScan(String... scanPackages) { Set<BeanDefinitionHolder> definitions = super.doScan(scanPackages); if (definitions.isEmpty()) { log.warn("No bean definition found in target packages " + Arrays.toString(scanPackages)); } else { for (BeanDefinitionHolder holder : definitions) { GenericBeanDefinition definition = (GenericBeanDefinition) holder .getBeanDefinition(); processBeanDefinition(definition); } } return definitions; } private void processBeanDefinition(GenericBeanDefinition definition) { definition.getPropertyValues().add("sqlMapInterface", definition.getBeanClassName()); definition.setBeanClass(SqlMapFactoryBean.class); definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); } /** * {@inheritDoc} */ @Override protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { return ((beanDefinition.getMetadata().isInterface() || beanDefinition.getMetadata().isAbstract()) && beanDefinition.getMetadata().isIndependent()); } /** * {@inheritDoc} */ @Override protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException { if (super.checkCandidate(beanName, beanDefinition)) { return true; } else { logger.warn("Skipping MapperFactoryBean with name '" + beanName + "' and '" + beanDefinition.getBeanClassName() + "' mapperInterface" + ". Bean already defined with the same name!"); return false; } } }